﻿#pragma once

#include <DirectXCollision.h>
#include <graphics/graphics_def.h>

namespace ifire::game {
struct Contact;
/// <summary>
/// 此BoundingCapsule类在初始化时，只需要传入start和end。因为是默认Y轴对齐。
///   start/end在初始化时会变成[0,start/end,0]，在经过Transform之后，会转为世界空间。
/// </summary>
struct BoundingCapsule {
  IVec3 start;  // 胶囊体起点（世界空间）
  IVec3 end;    // 胶囊体终点（世界空间）
  float radius; // 胶囊体半径

  // 构造函数
  BoundingCapsule();
  BoundingCapsule(float start, float end, float radius);

  // 获取变换后的世界空间胶囊体
  void Transform(IVec worldPos, IVec rotation, IVec scaling);

  // 碰撞检测辅助函数
  bool Intersects(const DirectX::BoundingSphere& sphere) const;
  bool Intersects(const DirectX::BoundingOrientedBox& box) const;
  bool Intersects(const BoundingCapsule& other) const;
};

} // namespace ifire::game